public with sharing class CustomerReportController {
   

	public String dataJson {private set;get;}

    public CustomerReportController() {
        	
        String type =System.currentPageReference().getUrl().toLowerCase();
       
    	Map<String,Object>dM = new Map<String,Object>();
    	if(type.contains('product')  ){

    		if(type.contains('spec' )){
    			dM.put('data',getData('cpb','Spec__c','Product__r.Spec__c'));
    		}else{
    			dM.put('data',getData('cpb','Area__c','Account__r.Area__c'));
    		}

    	}else{
    		

    		if(type.contains('spec')  ){
    			dM.put('data',getData('gcb','Spec__c','Product__r.Spec__c'));
    		}else{
    			dM.put('data',getData('gcb','Area__c','Account__r.Area__c'));
    		} 

    	}
    	dataJson = EncodingUtil.urlEncode(JSON.serialize(dM),'UTF-8');

    }

/*
工程仪器服务覆盖率报表：
1、分母：
   数据源：仪器
   条件：
   1）仪器产品的“报表统计类型”包含“自产产品(工程用)“(产品字段: )
   2）仪器上“退换机标志”不包含“退机”、“换机”、“报废”
   3）仪器客户的客户名不包含“迈克测试”
   4）仪器客户的记录类型等于“经销商”,“迈克”,“公共关系”,“公共关系(个人)”,“终端客户”、“供应商”  (不包含(海外))
   
   5）仪器的安装日距今天大于90天的
   
2、分子：
   数据源：仪器
   条件：
   1）仪器产品的“报表统计类型”包含“自产产品(工程用)“
   2）仪器上“退换机标志”不包含“退机”、“换机”、“报废”
   3）仪器客户的客户名不包含“迈克测试”
   4）仪器客户的记录类型等于“经销商”,“迈克”,“公共关系”,“公共关系(个人)”,“终端客户”、“供应商”
   5）仪器的安装日距今天大于90天的


   6）当前年度有服务工单 或 保养工单 相关工单的仪器
   7）相关工单的状态为完成

  
3、统计维度：
   1）按照仪器的客户的"子公司大区"维度统计
   2）按照仪器的规格统计
   
   
   
产培仪器覆盖率报表：

	1、分母：
	   数据源：仪器
	   条件：
	   1）仪器产品的“报表统计类型”包含“自产产品(产培用)“
	   2）仪器上“退换机标志”不包含“退机”、“换机”、“报废”
	   3）仪器客户的客户名不包含“迈克测试”
	   4）仪器客户的记录类型等于“经销商”,“迈克”,“公共关系”,“公共关系(个人)”,“终端客户”、“供应商”
	   
	   5）仪器的安装日距今天大于90天的
	   
	2、分子：
	   数据源：仪器
	   条件：
	   1）仪器产品的“报表统计类型”包含“自产产品(产培用)“
	   2）仪器上“退换机标志”不包含“退机”、“换机”、“报废”
	   3）仪器客户的客户名不包含“迈克测试”
	   4）仪器客户的记录类型等于“经销商”,“迈克”,“公共关系”,“公共关系(个人)”,“终端客户”、“供应商”
	   5）仪器的安装日距今天大于90天的
	   
	   6）当前年度有 上试剂 或 临床推广 或 仪器校准 或 外出解决问题 或 应用培训延续服务 或 技术巡回 或 授课培训 或 用户反馈 或 评价试验 或 软件安装培训 或 仪器培训的培训类型为再次培训 相关工单的仪器
	   
	   7）相关工单的状态为完成
	   
	3、统计维度：
	   1）按照仪器的客户的子公司大区维度统计
	   2）按照仪器的规格统计
   
*/

   /*	

   		type : gcb,cpb 
		
   		field : Spec__c
		groupby: Product__r.Spec__c


		field : Area__c
		groupby: Account__r.Area__c


   */
    public Map<String,Decimal> getData(String type , String field , String groupby ){

    	String rtype  = type == 'gcb' ? ' \'%自产产品(工程用)%\' ' :  type == 'cpb' ? ' \'%自产产品(产培用)%\' ' :' '  ;
    	if(rtype == ' ')return null ;
    	List<String> recortypes = null;
    	recortypes = type == 'cpb' ? new List<String>{'Reagents','clinicalpromotion','ProblemSolving',
    	'RecordTypeTrackingRecordAfterTraining','TechnicalTours','TeachingTraining'
    	,'UsersReflect','EvaluationTest','SoftwareInstallationTraining'} : type == 'gcb' ? new List<String>{'MaintenanceOrder','ServiceOrder'} : null ;

    	if(recortypes == null )return null;

    	Map<String,Decimal> specMap = new Map<String,Decimal>();
    	//90天前
		String  before90 = System.now().addDays(-90).format('yyyy-MM-dd');
	
		Set<String> pset = new Set<String>();

		
		String tsql = 'select count(Id) total ,'+groupby +'  from equipment__c where '+
                        'Product__r.ReportStatisticalTypes__c like  '+rtype+  
                        'and Product__r.Spec__c != null  '+ 
                        'and EndDate__c < '+ before90 +' '+ 
                        'and (not Account__r.Recordtype.name like \'%海外%\')  '+ 
                       	'and (not Type__c like \'%退机%\') '+ 
                        'and (not Type__c like \'%换机%\')  '+ 
                        'and (not Type__c like \'%报废%\') '+ 
                        'and  (not Account__r.Name  like \'%迈克测试%\') '+ 
                        'and OpponentStatus__c = \'正常使用\' '+
                        'group by  '+groupby;

		for(AggregateResult arg :  Database.query(tsql)){
			
		    specMap.put(String.valueOf(arg.get(field)),Decimal.valueOf(String.valueOf(arg.get('total'))) );
		}
		
		Map<String,Decimal> wokMap = new Map<String,Decimal>();
		String wsql = 'select COUNT_DISTINCT(ServiceManufacture__c) total, ' +
                	'ServiceManufacture__r.'+groupby+'  from WorkOrder__c where Status__c = \'完成\'  '+ 
                    'and RecordType.developerName in   (\''+String.join( recortypes, '\',\'')+'\') ' ;

                   if(type == 'cpb'){

                    	wsql+= 'and  ( ServiceManufacture__r.'+groupby+' in  (\''+String.join(new List<String>(specMap.keySet()), '\',\'') +'\' ) '+
                   	    ' or   ( RecordType.DeveloperName =  \'InstrumentsTraining\'  and  TrainingType__c = \'再次培训\') ) ' ;

                   }else{
                    	wsql+= 'and ServiceManufacture__r.'+groupby+' in  (\''+String.join(new List<String>(specMap.keySet()), '\',\'') +'\' ) ';
                   }

                    wsql+='and ServiceManufacture__r.EndDate__c < '+ before90 +' '+
                    'and  ServiceManufacture__r.Product__r.ReportStatisticalTypes__c like   '+rtype+   
                    'and (not ServiceManufacture__r.Account__r.Recordtype.name like \'%海外%\') '+ 
                    'and (not ServiceManufacture__r.Type__c like \'%退机%\') '+ 
                    'and (not ServiceManufacture__r.Type__c like \'%换机%\') '+ 
                    'and (not ServiceManufacture__r.Type__c like \'%报废%\') '+ 
        			'and  (not ServiceManufacture__r.Account__r.Name  like \'%迈克测试%\') '+
        			'and ServiceManufacture__r.OpponentStatus__c = \'正常使用\' '+
        			'and  Install_End_Datetime__c >= '+System.now().year()+'-01-01T00:00:00Z '+
        			'group by  ServiceManufacture__r.'+groupby ;

        			System.debug(wsql);

		for(AggregateResult arg :Database.query(wsql)){
		    wokMap.put(String.valueOf(arg.get(field)),Decimal.valueOf(String.valueOf(arg.get('total'))) );
		}

		for(String k : specMap.keySet()){
			Decimal rito  =  wokMap.get(k) == null || wokMap.get(k) == 0 ? 0 :  wokMap.get(k) / specMap.get(k)  ;
			specMap.put(k, rito);
		}


		return specMap;
    }
}